package com.site.codegen.disposer.impl;

import com.alibaba.fastjson2.JSON;
import com.site.codegen.disposer.CommandDisposer;
import com.site.codegen.utils.DatabaseUtil;
import com.site.codegen.vo.DatasourceArgs;
import com.site.codegen.vo.Table;
import org.apache.commons.lang3.StringUtils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class TableListDisposer implements CommandDisposer {
    @Override
    public Object dispose(String data) {
        DatasourceArgs datasourceArgs = JSON.parseObject(data, DatasourceArgs.class);
        Connection connection = null;
        List<Table> list = new ArrayList<>();

        try {
            connection = DatabaseUtil.getConnection(datasourceArgs.getDriverClass(), datasourceArgs.getUrl(), datasourceArgs.getUsername(), datasourceArgs.getPassword(), datasourceArgs.getDriverPath());
            DatabaseMetaData databaseMetaData = connection.getMetaData();
            /*
            　　  catalog 包含目录名称的 String。对此参数提供 Null 值表示无需使用目录名称。
　　              schema 包含架构名称模式的 String 值。对此参数提供 Null 值表示无需使用架构名称。
　　              tableNamePattern 包含表名称模式的 String。
　　              types 含有要包含的表类型的字符串数组。Null 表示应包含所有表类型。
            * */
            ResultSet tableResultSet = databaseMetaData.getTables(datasourceArgs.getCatalog(), datasourceArgs.getSchema(), null, new String[]{"TABLE", "VIEW"});
            while (tableResultSet.next()) {
                Table table = new Table();
                table.setTableCatalog(tableResultSet.getString("TABLE_CAT"));
                table.setTableSchema(tableResultSet.getString("TABLE_SCHEM"));
                table.setTableName(tableResultSet.getString("TABLE_NAME"));
                table.setTableType(tableResultSet.getString("TABLE_TYPE"));
                table.setTableComment(tableResultSet.getString("REMARKS"));
                list.add(table);
            }
            tableResultSet.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        list.sort((o1, o2) -> {
            int value = StringUtils.compare(o1.getTableCatalog(), o2.getTableCatalog());
            if (value != 0) {
                return value;
            }
            value = StringUtils.compare(o1.getTableSchema(), o2.getTableSchema());
            if (value != 0) {
                return value;
            }
            value = StringUtils.compare(o1.getTableType(), o2.getTableType());
            if (value != 0) {
                return value;
            }
            return StringUtils.compare(o1.getTableName(), o2.getTableName());
        });

        return list;
    }
}
